/* 
1. 迭代器的自动迭代
2. 返回一个promise
3. 实现迭代器的有序迭代
 */
/* 
handleNext 
1. 执行迭代器的next方法进行迭代
2. 传入next，调用handleResult函数
 */

/* 
handleResult
1. 判断迭代器是否迭代完成
2. 若迭代器迭代完成，返回迭代器的value值
3. 若迭代器未迭代完成，返回一个promise使用then方法，传入handleNext继续进行迭代
 */
/* 
关键点：
1. 若在Promise.resolve()中传入promise，则等待传入promise决议后再决议Promise.resolve返回的promise
2. 若在then中的onResolved中返回一个promise，则等待onResolved返回的promise决议后，决议then返回的promise
 */
// 使用async、await的注意点
/* 
await ---> yield
async ---> 将函数当作gen传入run中

要await一个promise
*/
function run (gen) {
  var args = [].slice.call(arguments, 1), it;
  it = gen.apply(this, args)
  return Promise.resolve.then(function handleNext(value) {
    var next = it.next(value)
    return (function handleResult(next) {
      if (next.done) {
        return next.value
      }else{
        return Promise.resolve(next.value).then(
          handleNext, 
          function handleError(err) {
            return Promise.resolve(it.throw(err)).then(handleResult)
          }
        )
      }
    })(next)
  })
}
function run1 (gen) {
  const args = [].slice.call(arguments, 1)
  // 迭代器  --- 不断调用它的next方法
  const it = gen.apply(this, args)
  return Promise.resolve().then(function handleNext(value){
    const next = it.next(value)
    return (function handleResult(next){
      if(next.done){
        return next.value
      }
      // 想要有序执行，必须要yield一个成功状态的Promise
      return Promise.resolve(next.value).then(handleNext, function handleError(err) {
        next.throw
      })
    })(next)
  })

}